/**
 * 接口访问前
 * @param {Object} config 接口访问所需参数
 * @param {Object} args	QS-Request拿到的参数
 * 
 * return  Object | Promise
 */
let device;
const setConfig = function(config, args) { //config为传给uni.request的参数, args 为传给QS-Request的参数
	return new Promise(async (rs, rj)=>{
		// if(args.useToken !== false && !uni.$qs.myStore.state.token) {
		// 	try{
		// 		await uni.$qs.myApis.common.getToken()
		// 	}catch(e) {
		// 		rj('获取token失败');
		// 		return;
		// 	}
		// }
		
		// config.header.token = uni.$qs.myStore.state.token;
		if(!device) device = uni.$qs.getSys();
		config.header.device = device;
		
		rs(config);
	})
}

/**
 * 接口访问后校验失败
 * @param {Object} result 接口访问返回数据
 * @param {Object} args	QS-Request拿到的参数
 */
const checkFail = function(err = {}, args = {}) {	//可以统一展示错误信息
	let t;
	t = err.errMsg || err.message || err.msg || '接口访问错误'
	if(args.errShowToast) {
		uni.$qs.toast(t);
	}else if(args.errShowModal) {
		uni.$qs.modal({
			content: t,
			showCancel: true,
			success: data=>{
				if(data.confirm) {
					
				}
				else{
					
				}
			}
		});
	}
}

/**
 * 接口访问失败
 * @param {Object} err 接口访问返回数据
 * @param {Object} args	QS-Request拿到的参数
 */
const requestCatch = function(err = {}, args = {}) {	//可以统一展示错误信息
	let t;
	t = err.data?.errMsg || err.data?.message || err.data?.msg || '接口访问错误'
	if(args.errShowToast) {
		uni.$qs.toast(t);
	}else if(args.errShowModal) {
		uni.$qs.modal(t);
	}
}

/**
 * 接口访问后校验数据
 * @param {Object} obj.res 接口访问返回数据 obj.type 判断返回数据方式
 * return true 则走Promise resolve
 * return false 则走Promise reject
 * return Object 目前，若Object.handleType为replaceData, 则该次访问将Object.result作为最终数据
 * 
 * return  Boolean | Object | Promise
 */
const checkRes = function(obj) { //对于返回数据的健壮性判断
	return new Promise(async (rs, rj)=>{	//可以return一个Promise对象达到异步效果，比如 检测到登录过期，可以先调用登录接口然后再次调用uni.$qs.request(args), 把最终数据直接resolve出去
		let {
			res,
			type,
			args
		} = obj;
		if (!res) return false;
		type = type !== undefined ? type : 'hasData';
		switch (type) {
			case 'hasData':
				if(res) rs(true);
				else rs(false);
			case 'code200':
				if (res) {
					if (res.code == 200) {
						rs(true);
					} else {
						rs(false);
					}
				} else {
					rs(false);
				}
				break;
			default:
				rs(true);
				break;
		}
	})
}

const filterResult = function (data) {
	return data;
}

module.exports = {
	setConfig,
	checkFail,
	requestCatch,
	checkRes,
	filterResult
}
